本文目標:
PFCP 主要用於 UPF 與 SMF 之間的 N4 Interface,任何與 PFCP 有關的資料都可以在 3GPP TS 29.244 找到。
補充:
- PFCP 採用 TLV(Tag + Length + Value = TLV)進行編碼,TLV 對訊息的壓縮很有幫助,只要將 Protocol 定義好就不需要用額外的 metadate 來描述資料。
- 處理 PFCP 時需要特別注意網路端與本地端的排序方式是否一致(大端或是小端)
下圖為 PFCP 的 Protocol Stack:
上圖為 PFCP 的 Protocol Stack,CP Function(SMF)與 UP Function(UPF)使用 N4 interface 傳遞 PDU Session 需要使用的 flow rule。
SMF 在某些情況下需要修改 PDU Session 的資訊(接收到 NAS-SM 訊息或是收到 PCF 的 policy decision 時,這個部分已經在先前的文章中探討過),當 SMF 持有的 PDU Session 資訊被更動,SMF 會向 UPF 發出 Session Modification Request 來更新 UPF 端的 flow rule。
參考上圖,每個 PFCP 訊息都需要遵守這個格式。
- if S = 0, SEID field is not present, k = 0, m = 0 and n = 5
- if S = 1, SEID field is present, k = 1, m = 5 and n = 13.
PFCP message 由一個 message header + 零至多個 Information Element 組合而成。
至於一個 PFCP message 到底會帶有多少個 IE 則取決於該訊息的用途,像是:
- PFCP Heartbeat Request/Response
- PFCP Association Setup Request/Response
- PFCP Session Establishment Request/Response
- ...
PFCP message 有 50 多種,不同 message 需要的 IE 都已經詳細定義在 TS 29.244。
PFCP message 主要可分為兩大類:
流程圖與相關定義在 TS 23.502 Clause 4.4.3。
參考 TS 29.244 Clause 5.8.2。
當 Association 建立後,CP 的行為如下:
當 Association 建立後,UP 的行為如下:
go-pfcp 是一套開源的 pfcp 套件,只要使用這個 Go package 就能快速的構造 PFCP 請求。
目前 go-pfcp 已經實作了 TS 29.244 R16 提到的多數 Procedure 與 Information Element,如果想要進一步了解如何 PFCP 訊息的話,參考該專案的原始程式碼會是一個不錯的選擇!
如果要構造一個 Association Req,可以這樣做:
import (
"time"
"github.com/wmnsk/go-pfcp/ie"
"github.com/wmnsk/go-pfcp/message"
)
req := message.NewAssociationSetupRequest(seq,
ie.NewNodeID("", "", "go-pfcp.epc.3gppnetwork.org"),
ie.NewRecoveryTimeStamp(time.Now()),
ie.NewUserPlaneIPResourceInformation(0x71, 15, "127.0.0.1", "", "some.instance.example", ie.SrcInterfaceAccess),
)
以 Association Req 中的 IE User Plane IP Resource Information
來看,從 NewUserPlaneIPResourceInformation()
函式來觀察每一個參數分別代表什麼:
func NewUserPlaneIPResourceInformation(flags uint8, tRange uint8, v4, v6, ni string, si uint8) *IE {
fields := NewUserPlaneIPResourceInformationFields(flags, tRange, v4, v6, ni, si)
b, err := fields.Marshal()
if err != nil {
return nil
}
return New(UserPlaneIPResourceInformation, b)
}
上面的函式需要傳入 flags、tRange、v4、v6、ni 以及 si 這些 payload,我們可以對照 3GPP TS 29.244 中的說明理解每一個 payload 的意義:
0x71
轉為二進制為 01110001
後,我們可以逐一對照每個 Bit 所代表的意義:
100
,即為 4。今天一口氣發了兩篇文章將 NGAP 與 PFCP 的部分結束掉了,等到 Data link layer 也介紹給大家後,會把重點放在核心網路運作時會碰到的大型流程(探討主要流程 + 仔細的閱讀規格書如何定義一個流程),將核心網路的基本觀念帶給大家後,系列文就可以進入到雲原生相關的議題討論啦!
版主您好:
最近有在研究5GC相關內容
有查詢到PFCP 這層Header
有部分還不太清楚
想詢問版主5GC目前是否是靠這層辨別Control 或 User Packet呢?
PFCP message 用於 SMF 與 UPF 之間的溝通,是屬於核心網路內部的 control plane message,Data Plane 的部分請參考 GTP protocol。
PS: TS 23.501 應該有對 Protocol Stack 加以描述,或是可以參考這篇文章。